A) Virtual mouse for host:
vi checker vilke input devices som hvores pc har, dette gøre i mappen /input
stud@GoldenImage:/dev/input$ ls -l
total 0
drwxr-xr-x 2 root root    120 2012-04-10 08:37 by-id
drwxr-xr-x 2 root root    180 2012-04-10 08:37 by-path
crw-r----- 1 root root 13, 64 2012-04-10 08:37 event0
crw-r----- 1 root root 13, 65 2012-04-10 08:37 event1
crw-r----- 1 root root 13, 66 2012-04-10 08:37 event2
crw-r----- 1 root root 13, 67 2012-04-10 08:37 event3
crw-r----- 1 root root 13, 68 2012-04-10 08:37 event4
crw-r--r-- 1 root root 13,  0 2012-04-10 08:37 js0
crw-r----- 1 root root 13, 63 2012-04-10 08:37 mice
crw-r----- 1 root root 13, 32 2012-04-10 08:37 mouse0
crw-r----- 1 root root 13, 33 2012-04-10 08:37 mouse1
crw-r----- 1 root root 13, 34 2012-04-10 08:37 mouse2
stud@GoldenImage:/dev/input$
vi compiler så den virtuelle mouse (cd vms)
Dette gøres med medfølgende make file
Herefter indsættes den virtuelle mouse med den sedvanlige kommando: sudo insmod vms.ko
stud@GoldenImage:/dev/input$ ls -l
total 0
drwxr-xr-x 2 root root    120 2012-04-10 08:37 by-id
drwxr-xr-x 2 root root    180 2012-04-10 08:37 by-path
crw-r----- 1 root root 13, 64 2012-04-10 08:37 event0
crw-r----- 1 root root 13, 65 2012-04-10 08:37 event1
crw-r----- 1 root root 13, 66 2012-04-10 08:37 event2
crw-r----- 1 root root 13, 67 2012-04-10 08:37 event3
crw-r----- 1 root root 13, 68 2012-04-10 08:37 event4
crw-r----- 1 root root 13, 69 2012-05-08 23:09 event5
crw-r--r-- 1 root root 13,  0 2012-04-10 08:37 js0
crw-r----- 1 root root 13, 63 2012-04-10 08:37 mice
crw-r----- 1 root root 13, 32 2012-04-10 08:37 mouse0
crw-r----- 1 root root 13, 33 2012-04-10 08:37 mouse1
crw-r----- 1 root root 13, 34 2012-04-10 08:37 mouse2
crw-r----- 1 root root 13, 35 2012-05-08 23:09 mouse3
stud@GoldenImage:/dev/input$
 
Vi kan nu se at der e rblevet tilføjet et ekstra mouse input i form af event 5 og mouse 3

Vi har nu mulighed for at skrive til den virtuelle mouse med kommandoen echo x y z > coordinates
stud@GoldenImage:/sys/devices/platform/vms$ echo 10 10 0 > coordinates
Vi ser at cursoren bevæger sig skråt ned af fra højre.

B)
Target
Vi kompiler som vil altid har gjort kernemodulet til target med kommando "make target".
herefter kopiers filen vms.ko til target med scp vms.ko root@10.9.8.2:
insdættes på target med insmod vms.ko

Vi kan se at vilke input devices der eksistere ved at skrive "ls -l/dev/input
Inden vms.ko indsættes
root@beagleboard:/dev# ls input
by-path       event1        event3        mouse0
event0        event2        mice          touchscreen0
root@beagleboard:/dev#
Efter indsættelse af vms.ko
root@beagleboard:/dev# ls input
by-path       event1        event3        mice          mouse1
event0        event2        event4        mouse0        touchscreen0
root@beagleboard:/dev#
 
Vi ser at event4 og mouse1 er blevet tilføjet.

Check efter copy af QT
root@beagleboard:~# echo $QWS_MOUSE_PROTO
Tslib:/dev/input/touchscreen0
root@beagleboard:~#
Vi ser at vi nu benytter touchscreen0

Vi tilføjer en virtual mus med variabler XYZ
export QWS_MOUSE_PROTO="Tslib:/dev/input/touchscreen0 IntelliMouse:/dev/input/mouseXYZ"
Vi køre qt_test2
vi skriver kordinater til musen
root@beagleboard:~# echo "10 10 0"> /sys/devices/platform/vms/coordinates
 

C) Lav din egen input driver som benytter GPIO interrupts.

Til dette har vi benytte grundmodeller fra tidligere øvelser til at få oprettet vore GPIO.
Vi har så derefter opsat de forskellige GPIO'er til at requeste og derefter bad vi dem blive opsat til indgange og udgange
unsigned int irq_nr_1,irq_nr_3,irq_nr_5,irq_nr_6;
 
 
     irq_nr_1=(gpio_to_irq(gpio[1].num)); //geting irq nummer
     irq_nr_3=(gpio_to_irq(gpio[3].num));
     irq_nr_5=(gpio_to_irq(gpio[5].num));
     irq_nr_6=(gpio_to_irq(gpio[6].num));
 
     printk(KERN_ALERT "irq nummeret er: %i\n",irq_nr_1);
     printk(KERN_ALERT "irq nummeret er: %i\n",irq_nr_3);
     printk(KERN_ALERT "irq nummeret er: %i\n",irq_nr_5);
     printk(KERN_ALERT "irq nummeret er: %i\n",irq_nr_6);
 
     if(request_irq(irq_nr_1,my_interrupt,IRQF_TRIGGER_FALLING,"GPIO_131_int",&gpio[1].num)) //requesting/init interrupt
     {
       printk(KERN_ALERT "could not request irq_1 \n");
     }
 
     if(request_irq(irq_nr_3,my_interrupt,IRQF_TRIGGER_FALLING,"GPIO_133_int",&gpio[3].num)) //requesting/init interrupt
     {
       printk(KERN_ALERT "could not request irq_3 \n");
     }
 
     if(request_irq(irq_nr_5,my_interrupt,IRQF_TRIGGER_FALLING,"GPIO_135_int",&gpio[5].num)) //requesting/init interrupt
     {
       printk(KERN_ALERT "could not request irq_5 \n");
     }
 
     if(request_irq(irq_nr_6,my_interrupt,IRQF_TRIGGER_FALLING,"GPIO_136_int",&gpio[6].num)) //requesting/init interrupt
     {
       printk(KERN_ALERT "could not request irq_6 \n");
     }
Efter at alle GPIO'er var opsatte kunne vi så opsætte vores interrupts ved at requeste irq.
Vi benytter &gpio[1].num til at checke vilket interrupt der bliver benyttet/påvirket.


Opsætningen af keyboard gøres som des ses i 3 søjler. Ved at gøre dette har devkittet mulighed for at registre input fra matrix keyboardet.
Om man ønsker at kunne benytte sig af det fulde matrix keyboard er man nød til på skift at sætte være søjle til 0 og så scanne rækkerne.
gpio_set_value(gpio[0].num, 0);
gpio_set_value(gpio[2].num, 0);
gpio_set_value(gpio[4].num, 0);
Interrupt implementeres

irqreturn_t my_interrupt( int irq, void * dev_id)
{
 
   int* id = (int*)dev_id;
 
 
   switch (*id)
   {
     case 131:
       input_report_rel(vms_input_dev, REL_X, -10);
       input_sync(vms_input_dev);
       break;
 
     case 133:
       input_report_rel(vms_input_dev, REL_X, 10);
       input_sync(vms_input_dev);
       break;
 
     case 135:
       input_report_rel(vms_input_dev, REL_Y, -10);
       input_sync(vms_input_dev);
       break;
 
 
     case 136:
       input_report_rel(vms_input_dev, REL_Y, 10);
       input_sync(vms_input_dev);
       break;
 
 
   }
 
   return IRQ_HANDLED;
 
}
I vores dev_id ligger de input elelr GPIO numre som gør at vi kan switche imellem de forskellige opsatte cases og på den måde skrive forskelligt til den virtuelle mouse og få den til at bevæge sig da vi så kalder input_sync.